package com.icez.base_util_library

import java.text.SimpleDateFormat
import java.util.*


/**
 *  时间工具类
 * @author icez
 */
class DateTimeUtil {
    companion object {
        val instance: DateTimeUtil by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
            DateTimeUtil()
        }

    }

    /**
     *  是否在指定的时间内
     * @param startTimeMillis 开始时间戳
     * @param endTimeMillis 结束时间戳
     * @param targetTimeMillis 针对的时间戳
     */
    public fun isTimeInterval(
        startTimeMillis: String?,
        endTimeMillis: String?,
        targetTimeMillis: String? = ""
    ): Boolean {
        var mTargetTimeMillis = targetTimeMillis
        if (mTargetTimeMillis.isNullOrEmpty()) {
            mTargetTimeMillis = System.currentTimeMillis().toString()
        }
        if (startTimeMillis.isNullOrEmpty() || endTimeMillis.isNullOrEmpty()) {
            return false
        }
        if (getTargetDelCurrent(mTargetTimeMillis.toLong(), startTimeMillis.toLong()) >= 0L &&
            getTargetDelCurrent(endTimeMillis.toLong(), mTargetTimeMillis.toLong()) >= 0L
        ) {
            return true
        }
        return false
    }

    /**
     *  获取当前年份
     */
    public fun currentYear(): Int {
        val mCalendar: Calendar = Calendar.getInstance()
        return mCalendar.get(Calendar.YEAR)
    }

    /**
     *  获取当前月份
     */
    public fun currentMonth(): Int {
        val mCalendar: Calendar = Calendar.getInstance()
        return mCalendar.get(Calendar.MONTH) + 1
    }

    /**
     *  获取当前天
     */
    public fun currentDay(): Int {
        val mCalendar: Calendar = Calendar.getInstance()
        return mCalendar.get(Calendar.DATE)
    }

    /**
     *  获取当前小时
     */
    public fun currentHour(): Int {
        val mCalendar: Calendar = Calendar.getInstance()
        return mCalendar.get(Calendar.HOUR_OF_DAY)
    }

    /**
     *  获取当前分钟
     */
    public fun currentMinute(): Int {
        val mCalendar: Calendar = Calendar.getInstance()
        return mCalendar.get(Calendar.MINUTE)
    }

    /**
     *  时间戳转字符串日期
     * @param timestamp 时间戳
     * @param format 格式:（yyyy->年 MM->月 dd->日 hh->12小時 mm->分鐘 ss->秒 HH->24小時）
     */
    public fun timestampToDateStr(timestamp: Long, format: String): String {
        try {
            var simplaDateFormat: SimpleDateFormat
            simplaDateFormat = SimpleDateFormat(format)
            var date = Date(timestamp)
            return simplaDateFormat.format(date)
        } catch (ex: Exception) {
            return ""
        }
    }

    /**
     *  事件字符串转时间戳
     * @param date 时间字符串
     * @param format 时间格式:（yyyy->年 MM->月 dd->日 hh->12小時 mm->分鐘 ss->秒 HH->24小時）
     */
    public fun dateStrToTimestamp(date: String, format: String): Long {
        try {
            var mSimpleDateFormat = SimpleDateFormat(format)
            return mSimpleDateFormat.parse(date).time
        } catch (ex: Exception) {
            return 0L
        }
    }

    /**
     *  获取指定月天数
     * @param year 年份
     * @param month 月份
     */
    public fun getDayForMonth(year: Int, month: Int): Int {
        val mCalendar = Calendar.getInstance()
        mCalendar[Calendar.YEAR] = year
        mCalendar[Calendar.MONTH] = month - 1
        mCalendar[Calendar.DATE] = 1 //把日期设置为当月第一天
        mCalendar.roll(Calendar.DATE, -1) //日期回滚一天，也就是最后一天
        return mCalendar[Calendar.DATE]
    }

    /**
     *  指定时间与当前时间的差
     * @param targetMillis 指定时间错 ，毫秒
     */
    public fun getTargetDelCurrent(targetMillis: Long, currentMillis: Long = 0): Long {
        var mCurrentMillis = currentMillis
        if (mCurrentMillis <= 0) {
            mCurrentMillis = System.currentTimeMillis()
        }
        return targetMillis - mCurrentMillis
    }

}